#ifndef FORMPICRECT_H
#define FORMPICRECT_H

#include "FormBaseWidget.h"
#include "components/DialogComponents.h"
#include "components/CommonFunc.h"
#include "components/CustomComponents.h"

#include <QColorDialog>
#include <QSpinBox>
#include <vector>

#define IMAGE_INDEX_INVALID (-1)

/// 图片详细信息结构体
typedef struct _IMG_INFO_S_
{
    uint        iWidth;         // 图片宽度
    uint        iHeight;        // 图片高度
    QString     strFormat;      // 图片格式

    // 清空已有数据
    void clear()
    {
        iWidth = 0;
        iHeight = 0;
        strFormat.clear();
    }
}IMG_INFO_S;

/// @brief 参数输入和解析窗口
class DialogPainter : public BaseDialog
{
    Q_OBJECT
public:
    DialogPainter(QWidget * parent = nullptr);

    virtual ~DialogPainter() {}
    // 获取边框颜色和大小值
    void GetColorSize(QColor &color, uint &iSize);
    // 配置图片详细信息
    void SetImageInfo(const IMG_INFO_S& stInfo);

private slots:
    // 获取颜色值
    void stl_OpenColorDialog();
    // 颜色选择更新
    void slt_ColorSelected(const QColor &color);
    // 坐标类型按钮状态修改
    void slt_NormalStateChanged(bool bStatus);
    // 修改关键字按钮状态修改
    void slt_EditKeyStateChanged(bool bStatus);
    // 修改关键字按钮状态修改
    void slt_ArrayStateChanged(bool bStatus);
    // 清空参数
    void slt_Clear();
    // 发送绘制信息
    void slt_DrawRect();

signals:
    // 文本发送信号
    void sendParams(QVector<IMG_RECT_FLOAT>&, QVector<IMG_RECT_INT>&);

private:
    // 解析输入报文
    bool parseParams(QVector<IMG_RECT_FLOAT>& vecParamFloat, QVector<IMG_RECT_INT>& vecParamInt);

private:
    QTabWidget*     m_pTabWidget;       // 主体窗口
    QColorDialog*   m_pColorDialog;     // 颜色选择窗口

    QGroupBox*      m_pGroupRectParam;  // 单个坐标类
    QLineEdit*      m_pLineX;           // X坐标参数
    QLineEdit*      m_pLineY;           // Y坐标参数
    QLineEdit*      m_pLineW;           // 宽度参数
    QLineEdit*      m_pLineH;           // 高度参数

    QLineEdit*      m_pLineInfoWidth;   // 图片宽度信息
    QLineEdit*      m_pLineInfoHeight;  // 图片高度信息
    QLineEdit*      m_pLineInfoFormat;  // 图片格式信息

    QLineEdit*      m_pColorInfo;       // 展示颜色信息
    QLabel*         m_pColorShow;       // 展示颜色
    QSpinBox*       m_pSpinSize;        // 边框大小
    QTextEdit*      m_pParamInput;      // 报文输入框

    QLineEdit*      m_pLineKeyX;        // X坐标参数关键字
    QLineEdit*      m_pLineKeyY;        // Y坐标参数关键字
    QLineEdit*      m_pLineKeyW;        // 宽度参数关键字
    QLineEdit*      m_pLineKeyH;        // 高度参数关键字

    MyCheckBox*      m_pCheckArray;     // 报文数组结构开关
    MyCheckBox*      m_pCheckEditKey;   // 修改关键字开关
    MyCheckBox*      m_pCheckNormal;    // 归一化坐标开关
    QColor          m_SelectedColor;    // 已选择颜色值
};

/// @brief 子标签页实现
class FormPicRect : public BaseFormWidget
{
    Q_OBJECT
public:
    FormPicRect(QWidget * parent = nullptr);

    virtual ~FormPicRect() {}
    // 设置风格
    void setFont(const QFont &stFont);

private slots:
    // 打开文件
    void slt_OpenFile();
    // 保存文件
    void slt_Save();
    // 返回上一张图（如有）
    void slt_Back();
    // 跳到下一张图（如有）
    void slt_Next();
    // 绘制参数输入
    void slt_ShowPaintParams();
    // 接收坐标参数并在图片上绘制
    void slt_PaintWithParams(QVector<IMG_RECT_FLOAT>& vecParamFloat, QVector<IMG_RECT_INT>& vecParamInt);

private:
    // 创建功能按钮
    void newFuncPtb();
    // 刷新展示图片
    void showImage(QImage pImage, bool bAdd = true);

protected:
    // 接收拖拽事件
    void dragEnterEvent(QDragEnterEvent *event);
    // 根据拖拽文件，读取并展示
    void dropEvent(QDropEvent *event);
    // 变更界面显示比例
    void resizeEvent(QResizeEvent *event);

private:
    DialogPainter*                  m_pPainter;         // 绘制窗口
    QFileDialog*                    m_fileDialog;       // 保存选择窗口
    QLabel*                         m_pImgLabelShow;    // 图片展示区域
    IMG_INFO_S                      m_stImageInfo;      // 图片详细信息
    std::vector<QImage>             m_vecImages;        // 图片列表
    int                             m_iImageShowIndex;  // 当前展示图片位置
};

#endif // FORMPICRECT_H
